package com.cn.appcore.http.interceptor;

import android.text.TextUtils;
import android.util.Log;


import com.cn.appcore.http.constant.HttpConstant;
import com.cn.appcore.utils.DecryptUtils;
import com.cn.appcore.utils.NLog;

import java.io.IOException;

import okhttp3.Headers;
import okhttp3.Interceptor;
import okhttp3.MediaType;
import okhttp3.Request;
import okhttp3.RequestBody;
import okhttp3.Response;
import okhttp3.ResponseBody;
import okio.Buffer;

public class LoggerInterceptor implements Interceptor {
    public static final String TAG = "OkGo";
    private String tag;
    private boolean showResponse;

    public LoggerInterceptor(String tag) {
        this(tag, false);
    }

    public LoggerInterceptor(String tag, boolean showResponse) {
        if (TextUtils.isEmpty(tag)) {
            tag = TAG;
        }
        this.showResponse = showResponse;
        this.tag = tag;
    }

    @Override
    public Response intercept(Chain chain) throws IOException {
        Request request = chain.request();
        logForRequest(request);
        Response response = chain.proceed(request);

        return logForResponse(response);
    }

    private void logForRequest(Request request) {
        try {
            String url = request.url().toString();
            Headers headers = request.headers();
            NLog.INSTANCE.d(tag, "╔════════════════════════════════════════════════════════════════ ▼▼▼▼▼▼ 请求 Start ▼▼▼▼▼▼ ══════════════════════════════════════════════════════════════════════════════╗");
            NLog.INSTANCE.d(tag, "║method : " + request.method());
            NLog.INSTANCE.d(tag, "║url : " + url);
            if (headers != null && headers.size() > 0) {
               NLog.INSTANCE.d(tag, "║headers : \n");
               NLog.INSTANCE.d(tag, "║"+headers.toString());
            }
            RequestBody requestBody = request.body();
            if (requestBody != null) {
                MediaType mediaType = requestBody.contentType();
                if (mediaType != null) {
                   NLog.INSTANCE.d(tag, "║contentType : " + mediaType.toString());
                    if (isText(mediaType)) {
                       NLog.INSTANCE.d(tag, "║content 请求参数: " + bodyToString(request));
                    }
//                    else {
//                       NLog.INSTANCE.d(tag, "║content : " + " maybe [file part] , too large too print , ignored!");
//                    }
                }
            }
        } catch (Exception e) {

           NLog.INSTANCE.d("请求异常--", e.getMessage());
        } finally {
           NLog.INSTANCE.d(tag, "┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄  请求 End  ┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄");
        }
    }

    private Response logForResponse(Response response) {
        try {
           NLog.INSTANCE.d(tag, "\"┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄  响应 Start  ┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄");
            Response.Builder builder = response.newBuilder();
            Response clone = builder.build();
           NLog.INSTANCE.d(tag, "║url : " + clone.request().url());
           NLog.INSTANCE.d(tag, "║stateCode : " + clone.code());
           NLog.INSTANCE.d(tag, "║protocol : " + clone.protocol());
            if (!TextUtils.isEmpty(clone.message()))NLog.INSTANCE.d(tag, "║message : " + clone.message());

            if (showResponse) {
                ResponseBody body = clone.body();
                if (body != null) {
                    MediaType mediaType = body.contentType();
                    if (mediaType != null) {
                       NLog.INSTANCE.d(tag, "║contentType : " + mediaType.toString());
                        if (isText(mediaType)) {
                            String resp = body.string();
//                           NLog.INSTANCE.d(tag, "║content 返回: " + new Gson().toJson(body.string()));
//                            if (json.length() > 4000) {
//                                // 如果消息长度超过最大限制，则分段打印
//                                for (int i = 0; i < json.length(); i += 4000) {
//                                    int end = Math.min(i + 4000, json.length());
//                                    NLog.INSTANCE.d("接口返回", "║content 返回: " +json.substring(i, end));
//                                }
//                            } else {
//                                // 消息长度未超过最大限制，直接打印
//                                NLog.INSTANCE.d("接口返回", "║content 返回: " + json);
//                            }
//                            String json = DecryptUtils.INSTANCE.decryptData(resp);
                            NLog.INSTANCE.d("接口返回", "║content 返回: " + resp);
                            body = ResponseBody.create(mediaType, resp);
                            return response.newBuilder().body(body).build();
                        } else {
                           NLog.INSTANCE.d(tag, "║content : " + " maybe [file part] , too large too print , ignored!");
                        }
                    }
                }
            }
        } catch (Exception e) {
           NLog.INSTANCE.d("请求异常--", e.getMessage());
        } finally {
           NLog.INSTANCE.d(tag, "╚═════════════════════════════════════════════════════════════════ ▲▲▲▲▲▲ 响应 End ▲▲▲▲▲▲ ═══════════════════════════════════════════════════════════════════════════════╝");
        }

        return response;
    }

    private boolean isText(MediaType mediaType) {
        if (mediaType.type() != null && mediaType.type().equals("text")) {
            return true;
        }
        if (mediaType.subtype() != null) {
            if (mediaType.subtype().equals("application/x-www-form-urlencoded") ||
                    mediaType.subtype().equals("json") ||
                    mediaType.subtype().equals("xml") ||
                    mediaType.subtype().equals("html") ||
                    mediaType.subtype().equals("webviewhtml")) //
                return true;
        }
        return false;
    }

    private String bodyToString(final Request request) {
        try {
            final Request copy = request.newBuilder().build();
            final Buffer buffer = new Buffer();
            copy.body().writeTo(buffer);
            return buffer.readUtf8();
        } catch (final IOException e) {
            return "something error when show requestBody.";
        }
    }
}
